#include "localtcpser.hpp"
#include "protocol.hpp"

void GetRequest(int *px, int *py, char *poper)
{
    std::cout << "x ->";
    std::cin >> *px;
    std::cout << "y ->";
    std::cin >> *py;
    std::cout << "oper ->";
    std::cin >> *poper;
}

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        CliErr();
        exit(ERR_SER);
    }
    uint16_t tcp_port = std::stoi(argv[2]);
    // 服务区IP
    Local_Inetaddr::Inetaddr ma_seraddr(argv[1], tcp_port);
    // socket对象
    std::unique_ptr<Local_Sock_Mod::Socket> ma_tcpcli = std::make_unique<Local_Sock_Mod::TcpSocket>();
    // 客户端模式
    ma_tcpcli->ClientTcpMod();
    // 客户端链接
    ma_tcpcli->ConnectCreate(&ma_seraddr);

    std::shared_ptr<Protocol> ma_proptr = std::make_shared<Protocol>();

    int x, y;
    char oper;
    while (1)
    {
        // globe: // 配合 goto globe 做多层循环跳转
        //  1.输入请求
        GetRequest(&x, &y, &oper);

        // 2.序列化// 3.添加报头// 4.发送
        Request ma_req;
        ma_req.Setx(x);
        ma_req.Sety(y);
        ma_req.Setoper(oper);

        ma_req.print();

        ma_proptr->BuildReques(ma_tcpcli, ma_req);

        // 5.接收// 6.反序列化// 7.获得结果
        Response ma_res;
        ma_proptr->GetResponse(ma_tcpcli, &ma_res);

        // 8.显示结果
        ma_proptr->ShowResponse(ma_res);

        // 2.序列化
        // std::string ma_mass = ma_req.Serialize(x, y, oper);
        // std::cout << "---------ma_mass---------" << std::endl;
        // std::cout << ma_mass << std::endl;
        // std::cout << "---------------------------" << std::endl;
        // 3.添加报头
        // std::string ma_allmass = ma_pro.AddHead(ma_mass);
        // std::cout << "---------ma_allmass---------" << std::endl;
        // std::cout << ma_allmass << std::endl;
        // std::cout << "---------------------------" << std::endl;
        // 4.发送
        // ma_tcpcli->Send(ma_allmass);
        // 5.接收
        // Response ma_res;
        // std::string ma_value;
        // while (1)
        // {
        //     int ret_rec = ma_tcpcli->Recv(&ma_value);
        //     std::cout << "---------ma_value---------" << std::endl;
        //     std::cout << ma_value << std::endl;
        //     std::cout << "-------------sss--------------" << std::endl;
        //     std::string lo_buffer;
        //     if (ret_rec > 0)
        //     {
        //         while (ma_pro.Decode(ma_value, &lo_buffer))
        //         {
        //             // 6.反序列化
        //             ma_res.Deserialize(ma_value);
        //             std::cout << "---------ma_value---------" << std::endl;
        //             std::cout << lo_buffer << std::endl;
        //             std::cout << "---------------------------" << std::endl;
        //             // 7.显示结果
        //             std::cout << "value: " << ma_res.Getvalue() << " cord: " << ma_res.Getcode() << std::endl;
        //             goto globe;
        //         }
        //         continue;
        //     }
        //     else if (ret_rec <= 0)
        //     {
        //         ma_tcpcli->Close();
        //         return 0;
        //     }
    }
    ma_tcpcli->Close();
    return 0;
}
